/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package ejerciciovectorenteros;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
 *
 * @author AdminLocal
 */
public class Pila implements Serializable
{

    private int[] valores;
    private int tamaño;
    private int capacidad;

    public Pila()
    {
        valores = new int[10];
        tamaño = 0;
        capacidad = 10;
    }

    public Pila(int capacidad)
    {
        valores = new int[capacidad];
        tamaño = 0;
        this.capacidad = capacidad;
    }

    public void apilar(int nuevoValor)
    {
        if (tamaño == (capacidad - 1))
        {
            cambiarCapacidad(capacidad*2);
        }
            valores[tamaño] = nuevoValor;
            tamaño++;
        
    }

    public int desapilar()
    {
        if (estaVacia())
        {
            System.out.println("***** La pila esta vacia *****");
            return 0;
        } else
        {
            int valor = valores[tamaño - 1];
            tamaño--;
            return valor;
        }
    }

    public int verCima()
    {
        if (estaVacia())
        {
            System.out.println("***** La pila esta vacia *****");
            return 0;
        } else
        {
            return valores[tamaño - 1];
        }
    }

    public void vaciar()
    {
        valores = new int[10];
        tamaño = 0;
        capacidad = 10;
    }

    public boolean estaLlena()
    {
        if (tamaño == (capacidad - 1))
        {
            return true;
        } else
        {
            return false;
        }
    }

    public boolean estaVacia()
    {
        if (tamaño == 0)
        {
            return true;
        } else
        {
            return false;
        }
    }

    @Override
    public String toString()
    {
        String cadena = "\n\rLista de valores:";
        for (int i=0;i<tamaño;i++)
        {
            cadena += " " + valores[i];
        }
        return cadena;
    }

    /**
     * @return the tamaño
     */
    public int getTamaño()
    {
        return tamaño;
    }

    /**
     * @return the capacidad
     */
    public int getCapacidad()
    {
        return capacidad;
    }

    /**
     * @param capacidad the capacidad to set
     */
    public void setCapacidad(int capacidad)
    {
        cambiarCapacidad(capacidad);
    }

    public void cambiarCapacidad(int capacidad)
    {
        this.capacidad = capacidad;
        int[] nuevaLista = new int[capacidad];
        for (int i = 0; i < tamaño; i++)
        {
            nuevaLista[i] = valores[i];
        }
        valores = nuevaLista;
    }
    public void serializar()
    {
        File fichero = new File("serializado.dat");
        FileOutputStream escritorFichero = null;
        ObjectOutputStream escritor = null;
        try
        {
            if (!fichero.exists())
            {
                fichero.createNewFile();
            }
            escritorFichero = new FileOutputStream(fichero);
            escritor = new ObjectOutputStream(escritorFichero);
            escritor.writeObject(this.valores);// guarda el array de valores
        } catch (IOException ex)
        {
            Logger.getLogger(Pila.class.getName()).log(Level.SEVERE, null, ex);
        } finally
        {
            try
            {
                escritor.close();
            } catch (IOException ex)
            {
                Logger.getLogger(Pila.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
    }
    public void deserializar()
    {
        File fichero = new File("serializado.dat");
        FileInputStream lectorFichero = null;
        ObjectInputStream lector = null;
        if (fichero.exists())
        {
            try
            {
                lectorFichero = new FileInputStream(fichero);
                lector = new ObjectInputStream(lectorFichero);
                this.valores = (int[]) lector.readObject(); // linea donde carga el array
            } catch (ClassNotFoundException ex)
            {
                Logger.getLogger(Pila.class.getName()).log(Level.SEVERE, null, ex);
            } catch (IOException ex)
            {
                Logger.getLogger(Pila.class.getName()).log(Level.SEVERE, null, ex);
            } finally
            {
                try
                {
                    lector.close();
                } catch (IOException ex)
                {
                    Logger.getLogger(Pila.class.getName()).log(Level.SEVERE, null, ex);
                }
            }
        }
    }
}
